package main


import (
	"fmt"
	"image/color"
)

type Names int
func (n *Names) Show() {
	fmt.Print(*n)
	//*n = 2
}

// 本身是指针类型 则不允许出现再 reciver 中
//type NamesPointer *int
//func (n NamesPointer) Show() {
//	fmt.Print(n)
//}

// 无论接收器是否是指针类型 调用方法的时候都可以不用显示区分
// 编译器会自行转换

// 扩展一个类型
type Point struct {
	X float64
	Y float64
}
func (p Point) Dist() float64 {
	return (p.X * p.X) + (p.Y * p.Y)
}

type ColoredPoint struct {
	Point
	Color color.RGBA
}

// 如果定义的方法接收器中没有使用指针类型
// 但是使用的时候 依然传递一个指针过去 也是不会有问题的
type User struct {
	Name string
}
func (u User) P() {
	fmt.Println(u.Name)
}


func main() {
	cp := ColoredPoint{}

	// 可以直接访问匿名成员的成员
	cp.X = 1.1
	cp.Y = 2.2

	fmt.Printf("%+v", cp)

	// 也可以通过指定匿名成员的类型来访问
	fmt.Printf("%+v", cp.Point.X)

	// 在外部类型中可以直接调用子类型的 method
	fmt.Printf("%+v", cp.Dist())

	u := User{Name: "1024"}
	(&u).P()
}
